﻿#include <iostream>
#include <boost/asio.hpp>
using namespace std;
using namespace boost::asio::ip;

// 定义最大缓冲区长度
const int MAX_LENGTH = 1024;

int main()
{
	try
	{
		// 创建IO上下文，用于所有asio操作的事件循环
		boost::asio::io_context ioc;

		// 创建TCP终端点，指定服务器IP和端口
		tcp::endpoint remote_ep(address::from_string("127.0.0.1"), 10086);

		// 创建TCP socket对象
		tcp::socket sock(ioc);

		// 定义错误码对象，初始化为主机未找到错误
		boost::system::error_code error = boost::asio::error::host_not_found;

		// 连接到服务器
		// 需要服务器先有 否则就是被拒绝

		sock.connect(remote_ep, error);

		// 检查连接是否成功
		if (error)
		{
			cout << "connect failed, code is " << error.value() << " error msg is " << error.message();
			return 0;
		}

		// 获取用户输入的消息
		std::cout << "Enter message: ";
		char request[MAX_LENGTH];
		std::cin.getline(request, MAX_LENGTH);
		size_t request_length = strlen(request);

		// 发送消息到服务器
		boost::asio::write(sock, boost::asio::buffer(request, request_length));

		// 接收服务器的响应
		char reply[MAX_LENGTH];
		size_t reply_length = boost::asio::read(sock,
												boost::asio::buffer(reply, request_length));

		// 显示服务器响应
		std::cout << "Reply is: ";
		std::cout.write(reply, reply_length);
		std::cout << "\n";

		// 等待用户按键后退出
		getchar();
	}
	catch (std::exception &e)
	{
		// 异常处理
		std::cerr << "Exception: " << e.what() << endl;
	}
	return 0;
}
